import { ERROR_CODES, ERROR_MSGS } from "./codes"

let _apiPrefix = ''
let _accessToken = ''

export class ApiError extends Error {
	constructor(code, message){
		super(message)
		this.code = code
	}
}

/**
 * 设置API前缀，如 "http://domain.com/api", "/api/"
 * 因网页版一般会由nginx代理接口地址，以保证不会出现跨域问题，所以网页版常用前缀可能时"/api/"形式，表示接口地址是 "http://当前网页访问地址/api"
 * 而对小程序，需要明确指定接口地址，所以常用"http://domain.com/api" 形式
 * @param {*} prefix 
 */
export const setApiPrefix = (prefix)=>{
	_apiPrefix = prefix
}

export const setAccessToken = (token)=>{
	_accessToken = token
}

/**
 * 服务器接口返回数据格式固定为：
 * {
 * 		code: 200,  //错误码
 * 		msg: '', 	//错误信息，当错误码不是200时，此字段不为空
 *      data: null, //接口返回值，返回类型可能是string, array, object, 有具体接口决定
 * }
 */
export const request = (uri, method, params, headers=null)=>{
	return new Promise((resolve, reject)=>{
		
		const _headers = headers || {}
		if(_accessToken != null){
			_headers['x-auth-token'] = _accessToken
		}
		uni.request({
			url: `${_apiPrefix}${uri}`,
			data: params,
			dataType: 'json',
			method,
			header: _headers,
			success(res){
				if(!res.data || !res.data.code){
					reject(new ApiError(ERROR_CODES.FAIL, ERROR_MSGS.FAIL))
					return
				}
				
				if(res.data.code != 200){
					reject(new ApiError(res.data.code, ERROR_MSGS[res.data.code] || res.data.msg))
					return
				}
				
				resolve(res.data.data)
			},
			fail(err){
				reject(new ApiError(ERROR_CODES.FAIL, ERROR_MSGS.FAIL))
			}
		})
	})
}

export const get = (uri, params, headers=null)=>{
	return request(uri, 'GET', params, headers)
}

export const post = (uri, params, headers=null)=>{
	return request(uri, 'POST', params, headers)
}